package com.yodel.www.tenhou;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import twitter4j.IDs;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;


public class TwitterFriendProfs {

	    private static int ID_COUNT_PER_REQUEST = 5000;

	    /**
	     * Twitterインスタンス
	     */
	    static Twitter sTwitter = new TwitterFactory().getInstance(); //自動的に認証してくれる

	    public static void main(String[] args) throws TwitterException {

	        try {

		        // 取得対象のユーザ名
		        String targetScreenName = "full_moon_kid";


		        // カーソル初期値。現状のt4jのjavadocは 1オリジンだが、Twitter API Documentでは -1オリジンなのでそちらに準拠
		        long cursor = -1L;
		        // 一時的にIDを格納するオブジェクト
		        IDs ids;
		        IDs idFs;
		        // IDを全てストックするオブジェクト
		        //HashSetを用いることにする
		        HashSet<Long> followerIDs = new HashSet<Long>();
		        HashSet<Long> friendIDs = new HashSet<Long>();

		        List<Long> Kataomoi= new ArrayList<Long>();
		        List<Long> Kataomoware= new ArrayList<Long>();

		        long page = 1L;

		        //フォロワーの取得
		        do {
		            // 状況表示
		            System.out.println(String.format("%dページ目取得中。(%d <= %d)", page, ID_COUNT_PER_REQUEST * (page - 1),
		                    ID_COUNT_PER_REQUEST * page++));

		            ids = sTwitter.getFollowersIDs(targetScreenName, cursor);
		            // 取得したIDをストックする
		            for (long id : ids.getIDs()) {
		                followerIDs.add(id);
		            }

		            // 次のページへのカーソル取得。ない場合は0のようだが、念のためループ条件はhasNextで見る
		            cursor = ids.getNextCursor();
		        } while (ids.hasNext());


		        //クリア
		        page = 1L;
		        cursor = -1L;


		        //フレンドの取得
		        do {
		            // フレンドが多いユーザだと無反応で寂しい＆不安なので状況表示
		            System.out.println(String.format("%dページ目取得中。。(%d <= %d)", page, ID_COUNT_PER_REQUEST * (page - 1),
		                    ID_COUNT_PER_REQUEST * page++));

		            idFs = sTwitter.getFriendsIDs(targetScreenName, cursor);
		            // 取得したIDをストックする
		            for (long idF : idFs.getIDs()) {
		            	friendIDs.add(idF);
		            }

		            // 次のページへのカーソル取得。ない場合は0のようだが、念のためループ条件はhasNextで見る
		            cursor = idFs.getNextCursor();
		        } while (idFs.hasNext());


		        //一致しないものを抽出
		        //片思い、片思われを分けた方が分かりやすい

		        //反復子iteratorによる取得
				Iterator<Long> ite = followerIDs.iterator();
				Iterator<Long> iteF = friendIDs.iterator();

		        //１．片思われの場合
				while(ite.hasNext()) {              //ループ
					Long obj = ite.next();        //該当オブジェクト取得

					//存在しない場合は片思われ
					if (friendIDs.contains(obj) == false) {
						Kataomoware.add(obj);
					}
				}

		        //２．片思いの場合
				while(iteF.hasNext()) {              //ループ
					Long objF = iteF.next();        //該当オブジェクト取得
					//存在しない場合は片思い
					if (followerIDs.contains(objF) == false) {
						Kataomoi.add(objF);
					}
				}


		        // ファイル出力
				//片思い
				output(String.format("C:\\Kataomoi_"+targetScreenName+".csv", targetScreenName), Kataomoi);

		        //片思われ
		        output(String.format("C:\\Kataomoware_"+targetScreenName+".csv", targetScreenName), Kataomoware);

	        } catch (IOException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
	    }


	    private static void output(String fileName, List<Long> ids) throws TwitterException, IOException {
	    	BufferedWriter wr = null;
	        try {
	        	//Shift-JISを指定
	            wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "Shift-JIS"));

	            for (long eachId : ids) {


	            	//書き出し

	            	//IDから変換してユーザーの詳細を取得
					//（数が多い場合は途中でAPI制限に引っ掛かるが）

					User user = sTwitter.showUser(eachId);

					//改行記号を除去する
					String strDes = user.getDescription().replaceAll("\r\n"," ");
					strDes = strDes.replaceAll("\n"," ");

					wr.write(String.valueOf(eachId)+","+user.getName()+","+user.getScreenName()+",");
	                wr.write(strDes);
	                wr.write("\n");


	                //念のためコンソールにも出力
					System.out.println(String.valueOf(eachId)+" "+"ユーザー名: "+user.getName()+" "+user.getScreenName());
					System.out.println(strDes);
	            }
	            wr.flush();
	            wr.close();

	        } catch (IOException e) {

	        	//それまでのものの書き出しを完了する
	        	wr.flush();
	        	wr.close();

	            e.printStackTrace();
	            System.exit(-1);
	        }
	    }
}